﻿using Autofac;
using SunnyPaine.Autofac.Extension.Mvvm.IOC;
using SunnyPaine.Autofac.Extension.Stereotype;
using System.Windows;

namespace SunnyPaine.Autofac.Extension.Mvvm.Test
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            //********************重要说明***************************//
            //1.在非特殊情况下，Windows窗口通常不为单例，所以注册根据业务需要决定是否使用单例注册
            //2.使用builder.UseAutoRegister();自动实例注册时，所有被ComponentType枚举指示的特性，默认都是单例注入，
            //  而Windows窗口和它的ViewModel应当是一对一的关系，所以ViewModel使用Controller特性标记后，应当将Controller的Scope属性设置为true，以保证非单例注册。
            //3.如果不启用Mvvm扩展，则使用以下方式注册视图和组件，视图和组件需要手动注册
            //  builder.RegisterWindow<Window1>("Window1");
            //  builder.RegisterWindow<Window2>("Window2");
            //  builder.RegisterControl<UserControl1>("UserControl1");
            //  builder.RegisterControl<UserControl2>("UserControl2");


            ContainerBuilder builder = new ContainerBuilder();//创建Autofac的IOC容器
            builder.UseAutoRegister();//启用自动实例注册
            builder.UseMvvm();//启用MVVM扩展
            builder.SetMainWindow<MainWindow>();//设置主窗口

            //builder.RegisterModule(new HostModule());//手动实例注册

            builder.Register();//自动实例注册，builder.UseAutoRegister()的后续
            builder.RegisterView();//注册视图，builder.UseMvvm()和builder.SetMainWindow<MainWindow>()的后续

            IContainer container = builder.Build();//构建IOC实例
            container.BuildAfter(new BuildAfter());//构建IOC后执行的事情

            container.ShowMainWindow();//显示主窗口
        }
    }
}